package com.nlgc365.designpattern.Chapter04_Pattern.Behavior.P02_Template.Usage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 模板模式的代码模板
 * 作用: 模板模式的写法
 */
public abstract class SomeCase {
    private static final Logger logger = LoggerFactory.getLogger(SomeCase.class);

    /**
     * 模板函数, 作用: 定义业务算法的流程
     * 定义为final, 不允许子类继承并修改该函数.
     */
    public final void templateMethod() {
        setUp();
        hook();
        tearDown();
    }

    /**
     * 钩子函数之前
     */
    private void setUp() {
        logger.info("Do something before hook function.");
    }

    /**
     * 写法1: 定义为抽象, 让子类必须继承重写
     * 钩子函数, 作用: 由子类继承, 实现多变需求逻辑
     */
    protected abstract void hook();

    /**
     * 写法2: 抛出运行时异常, 让子类必须继承重写
     * 钩子函数, 作用: 由子类继承, 实现多变需求逻辑
     */
    protected void hook2() {
        logger.error("UnRewritten hook method!");
        throw new RuntimeException("UnRewritten hook method!");
    }

    /**
     * 钩子函数之后
     */
    private void tearDown() {
        logger.info("Do something after hook function.");
    }

}
